package tool

// by daoyi
import (
	"bufio"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"os"
)

type Config struct {
	AppName string      `json:"app_name"`
	AppMode string      `json:"app_mode"`
	AppHost string      `json:"app_host"`
	AppPort string      `json:"app_port"`
	Sms     SmsConfig   `json:"sms"`
	Mysql   MysqlConfig `json:"mysql"`
	Redis   RedisConfig `json:"redis"`
}

type SmsConfig struct {
	SignName     string `json:"sign_name"`
	TemplateCode string `json:"template_code"`
	RegionId     string `json:"region_id"`
	AppKey       string `json:"app_key"`
	AppSecret    string `json:"app_secret"`
}

type MysqlConfig struct {
	Root     string `json:"root"`
	Pwd      string `json:"pwd"`
	Local    string `json:"local"`
	Database string `json:"database"`
	Port     string `json:"port"`
}

type RedisConfig struct {
	Pwd         string `json:"pwd"`
	Local       string `json:"local"`
	Port        string `json:"port"`
	Db          int    `json:"db"`
	PoolSize    int    `json:"poolSize"`
	MinIdleConn int    `json:"minIdleConn"`
}

// 定义一个config指针类型
var Cfg *Config = nil

func ParseConfig(path string) (*Config, error) {
	//打开路径path 中的文件
	file, err := os.Open(path)
	//判断打开文件是否正常，否则抛出异常
	if err != nil {
		panic(err)
	}
	// 程序最后执行 关闭文件
	defer file.Close()
	//读取 file文件内容
	reader := bufio.NewReader(file)
	// 将读取的数据解析json
	decoder := json.NewDecoder(reader)
	//解析数据，并赋值到指针*Config类型数据中，并判断是否成功
	if err := decoder.Decode(&Cfg); err != nil {
		log.Println(err)
		return nil, err
	}
	//成功，返回读取的值
	return Cfg, nil
}

// 修改json文件配置
func WriteIn(name string, title string) {
	// 从文件中读取json数据
	file, err := os.Open("app.json")
	if err != nil {
		fmt.Println("open file err:", err)
		return
	}
	defer file.Close()
	data, err := ioutil.ReadAll(file)
	if err != nil {
		fmt.Println("read file err:", err)
		return
	}
	// 将json数据反序列化
	var conf Config
	if err := json.Unmarshal(data, &conf); err != nil {
		fmt.Println("unmarshal err:", err)
		return
	}
	// 修改配置
	conf.AppName = "Tom"
	conf.AppMode = "111"
	// 将修改后的配置序列化
	newData, err := json.Marshal(&conf)
	if err != nil {
		fmt.Println("marshal err:", err)
		return
	}
	// 将序列化后的数据写入新文件
	newFile, err := os.Create("app.json")
	if err != nil {
		fmt.Println("create file err:", err)
		return
	}
	defer newFile.Close()
	if err := ioutil.WriteFile(
		"config.json", newData, 0666); err != nil {
		fmt.Println("write file err:", err)
		return
	}
	fmt.Println("modify config success")
}
